class: center, middle, inverse, title-slide .title[ # Muestrear no es pecado ] .subtitle[ ## Estadísticos en big data ] .author[ ### José Luis Cañadas Reche ] .date[ ### 2022/11/04 (updated: 2022-11-19) ] --- <style type="text/css"> .remark-slide-content { font-size: 24px; padding: 20px 80px 20px 80px; } .remark-code, .remark-inline-code { background: #f0f0f0; } .remark-code { font-size: 14px; } .huge .remark-code { /*Change made here*/ font-size: 150% !important; } .tiny .remark-code { /*Change made here*/ font-size: 50% !important; } </style> ## Muestrear no es pecado * Grandes empresas, áreas de big data * Perfiles científicos de datos: Físicos, telecos, matemáticos, ¿estadísticos? ??? * Hay mucho advenedizo que programa bien, pero le faltan las bases --- ## Muestreo * Tenemos grandes volúmenes de datos. - 4 millones de filas por día y 170 variables. - Modelos requieren tener varios días de entrenamiento, (120 millones de filas a veces) * Estrategias - Muestreo estratificado por variables claves, (meses, días semana, otras variables) - Submuestro de la categoría mayoritaria (clientes no fugan) ??? * Mucha gente tira con todos los datos, pérdida de tiempo * La potencia sin control no sirve de nada --- ## Muestreo (código en R) .pull-left[ ```r tmp %>% head(3) ``` ``` #> # Source: spark<?> [?? x 4] #> valor_cliente edad segmento tipo #> <dbl> <dbl> <chr> <chr> #> 1 3 79 No_way B #> 2 3 79 No_way B #> 3 3 79 No_way B ``` ```r tmp %>% group_by(segmento) %>% count() ``` ``` #> # Source: spark<?> [?? x 2] #> segmento n #> <chr> <dbl> #> 1 No_way 1103691 #> 2 Neut 751481 #> 3 Best 197391 #> 4 Rec 375823 ``` ] .pull-right[ ```r tmp_sample <- tmp %>% group_by(segmento) %>% sdf_sample(fraction = 0.5, replacement = FALSE, seed = 155) ``` ```r tmp_sample %>% group_by(segmento) %>% count() ``` ``` #> # Source: spark<?> [?? x 2] #> segmento n #> <chr> <dbl> #> 1 No_way 551695 #> 2 Neut 375025 #> 3 Best 98643 #> 4 Rec 187686 ``` ] --- ## Agregaciones y frecuencias * Inconcebiblemente mucha gente no entiende este concepto. * Ayuda a tener misma información ocupando menos * Mejora computacional * Utilizar técnicas no disponibles en herramientas big data sin perder info --- ## Agregaciones y frecuencias (código) .pull-left[ ```r sdf_nrow(tmp) ``` ``` #> [1] 2428386 ``` ```r head(tmp, 5) ``` ``` #> # Source: spark<?> [?? x 4] #> valor_cliente edad segmento tipo #> <dbl> <dbl> <chr> <chr> #> 1 3 79 No_way B #> 2 3 79 No_way B #> 3 3 79 No_way B #> 4 3 79 No_way B #> 5 3 79 No_way B ``` ] .pull-right[ ```r tmp_agregado <- tmp %>% group_by(valor_cliente, edad, segmento, tipo) %>% count() %>% arrange(desc(n)) head(tmp_agregado, 10) ``` ``` #> # Source: spark<?> [?? x 5] #> # Groups: valor_cliente, edad, segmento #> # Ordered by: desc(n) #> valor_cliente edad segmento tipo n #> <dbl> <dbl> <chr> <chr> <dbl> #> 1 2 81 No_way SF 13379 #> 2 2 85 No_way SF 12356 #> 3 2 84 No_way SF 11657 #> 4 2 86 No_way SF 11274 #> 5 2 78 No_way SF 10943 #> 6 2 87 No_way SF 10232 #> 7 2 83 No_way SF 10158 #> 8 2 79 No_way SF 10021 #> 9 2 77 No_way SF 9869 #> 10 2 80 No_way SF 9738 ``` ```r sdf_nrow(tmp_agregado) ``` ``` #> [1] 9598 ``` ] --- ## Agregaciones y frecuencias (código) .pull-left[ ```r tmp_local <- tmp_agregado %>% collect() %>% mutate(across(where(is.character), as_factor)) %>% mutate( edad_cat = case_when( edad <= 20 ~ "<21", edad <= 40 ~ "21- 40", edad <= 50 ~ "41-50", edad <= 60 ~ "40-60", edad > 60 ~ ">60" ) ) ``` ```r library(lme4) modA <- glmer( segmento == "Best" ~ (1 |edad_cat) + (1 | valor_cliente) + (1 | tipo), data = tmp_local, family = binomial, weights = tmp_local$n ) ``` ] .pull-right[ ```r plots <- sjPlot::plot_model(modA, type = "re", sort.est = TRUE, grid = FALSE) plots[[2]] ``` <img src="data:image/png;base64,#Muestrear_no_es_pecado_files/figure-html/unnamed-chunk-12-1.png" width="100%" /> ] --- ## Grupos de control y proporciones pequeñas * Es sorprendente el desconocimiento que hay de la necesidad de medir. * Ahí es dónde los estadísticos resultamos fundamentales * No es extraño tener prevalencias pequeñas y hay que alertar de lo poco fiable de los grupos de control diseñados * R nos ayuda en ese cometido --- ## Grupos de control (código) ```r library(pwr) power_analisis <- pwr.2p.test( h = ES.h(p1 = 0.012 , p2 = 0.01), sig.level = 0.05, power = 0.8, alternative = "greater" ) power_analisis ``` ``` #> #> Difference of proportion power calculation for binomial distribution (arcsine transformation) #> #> h = 0.01919474 #> n = 33560.9 #> sig.level = 0.05 #> power = 0.8 #> alternative = greater #> #> NOTE: same sample sizes ``` --- ## Grupos de control (código) ```r plot(power_analisis) ``` <img src="data:image/png;base64,#Muestrear_no_es_pecado_files/figure-html/unnamed-chunk-14-1.png" width="100%" /> ??? * Tamaño muestral inasumible para negocio en una campaña * Gestionar expectativas. * Lo que más determina es la pasta * Medir incertidumbre después del experimento --- ## El humo lo invade todo * Vivimos épocas dónde el *hype* lo invade todo * Incluso profesionales con dilatada experiencia son víctimas del humo * Ejemplo: Librerías nuevas que prometen que van a obtener el Performance del modelo sin tener un grupo de control. Aquí un par de post desmontando tal falacia - [Post en Datanalytics](https://www.datanalytics.com/2022/05/31/nannyml/) - [Post en muestrear no es pecado](https://muestrear-no-es-pecado.netlify.app/2022/05/29/no-mentir-s/) ??? * Es muy peligroso este tipo de humo. Imaginaros que un líder técnico se cree tal falacia o peor aún, alguien de negocio. Y deciden que ya no hace falta grupos de control. La empresa puede empezar a perder dinero a espuertas sin darse cuenta. --- ## Forma y contenido * Reinventar la rueda, olvidando el propósito * Machine Learning Engineer y devops * Representa peligro de centrarnos en la herramienta en vez de en la utilidad. ??? * Por supuesto que es útil, y debemos hacer código mantenible con test, etc.. Pero hay mucho "flipaillo" que al centrarse en la forma se olvida el contenido y la utilidad. * "He visto cosas en producción que no creeríais". Cosas bien hechas técnicamente (en cuestión de código y test) pero con escaso o nulo valor --- ## Gracias <img src="data:image/png;base64,#colegio.jpg" width="40%" height="40%" style="display: block; margin: auto;" />